package com.example.excelimport.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.List;

public class PageDataListener <T> extends AnalysisEventListener<T> {
    private final List<T> resultList;
    private final int targetPage;
    private final int pageSize;
    private int currentPage = 0;
    private int currentRowInPage = 0;
    private boolean dataCollected = false;

    public PageDataListener(List<T> resultList, int targetPage, int pageSize) {
        this.resultList = resultList;
        this.targetPage = targetPage;
        this.pageSize = pageSize;
    }

    @Override
    public void invoke(T data, AnalysisContext context) {
        currentRowInPage++;

        // 如果当前行数超过页大小，进入下一页
        if (currentRowInPage > pageSize) {
            currentPage++;
            currentRowInPage = 1;
        }

        // 如果是目标页的数据，则收集
        if (currentPage == targetPage - 1) { // 页码从1开始，内部从0开始
            resultList.add(data);
        }

        // 如果已经收集完目标页数据，且开始收集下一页数据，则停止读取
        if (currentPage >= targetPage && resultList.size() >= pageSize) {
            dataCollected = true;
            // 这里无法直接停止读取，EasyExcel没有提供直接停止的方法
            // 但我们可以标记不再处理后续数据
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 解析完成
    }

    @Override
    public boolean hasNext(AnalysisContext context) {
        // 如果数据已经收集完成，可以提前结束（但EasyExcel可能不会完全停止）
        return !dataCollected;
    }
}